package com.study.design.pattern.pattern.behavioral.state;

/**
 * @Author: gongsl
 * @Date: 2025-03-29 21:33
 * @description: 订单上下文 - 维护当前状态并委托操作给状态对象
 */
public class OrderContext {
    /**
     * 当前订单状态
     */
    private OrderState state;
    /**
     * 订单唯一标识
     */
    private final String orderId;

    /**
     * 构造函数初始化订单状态为未支付
     * @param orderId 订单编号
     */
    public OrderContext(String orderId) {
        this.orderId = orderId;
        this.state = new UnpaidState();
    }

    /**
     * 状态变更方法（包私有）
     * @param newState 新的状态实例
     */
    public void setState(OrderState newState) {
        System.out.printf("订单[%s]状态变更：%s → %s%n",
                orderId,
                state.getClass().getSimpleName(),
                newState.getClass().getSimpleName());
        this.state = newState;
    }

    // 以下是暴露给外部的业务方法 --------------------------

    /**
     * 执行支付操作
     */
    public void pay() {
        state.pay(this);
    }

    /**
     * 执行取消订单操作
     */
    public void cancel() {
        state.cancel(this);
    }

    /**
     * 执行发货操作
     */
    public void ship() {
        state.ship(this);
    }

    /**
     * 执行确认收货操作
     */
    public void receive() {
        state.receive(this);
    }
}
